﻿//
// Icon.cs
//
// Author:
//   Scott Peterson <lunchtimemama@gmail.com>
//
// Copyright (C) 2008 S&S Black Ltd.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

using System;
using System.IO;
using System.Xml;

namespace Mono.Upnp.Server
{
	public class Icon
	{
        private readonly int width;
        private readonly int height;
        private readonly int depth;
        private readonly string format;
        private readonly string path;
        private byte[] data;
        private Uri url;

        public Icon (int width, int height, int depth, string format, byte[] data)
             : this (width, height, depth, format)
        {
            if (data == null) {
                throw new ArgumentNullException ("data");
            }
            this.data = data;
        }

        public Icon (int width, int height, int depth, string format, string path)
            : this (width, height, depth, format)
        {
            this.path = path;
        }

        protected internal virtual void Initialize (Uri iconUrl)
        {
            url = iconUrl;
        }

        protected Icon (int width, int height, int depth, string format)
        {
            if (format == null) {
                throw new ArgumentNullException ("format");
            }

            if (format.StartsWith ("image/")) {
                format = format.Substring (6);
            }

            this.width = width;
            this.height = height;
            this.depth = depth;
            this.format = format;
        }

        protected internal virtual byte[] Data {
            get {
                if (data == null) {
                    data = File.ReadAllBytes (path);
                }
                return data;
            }
        }

        private string mimetype;
        internal string MimeType {
            get {
                if (mimetype == null) {
                    mimetype = String.Format ("image/{0}", format);
                }
                return mimetype;
            }
        }

        protected internal virtual void Serialize (XmlWriter writer)
        {
            writer.WriteStartElement ("icon");
            writer.WriteStartElement ("mimetype");
            writer.WriteValue (MimeType);
            writer.WriteEndElement ();
            WriteElement (writer, "width", width);
            WriteElement (writer, "height", height);
            WriteElement (writer, "depth", depth);
            writer.WriteStartElement ("url");
            writer.WriteValue (url);
            writer.WriteEndElement ();
            writer.WriteEndElement ();
        }

        private static void WriteElement (XmlWriter writer, string name, int value)
        {
            writer.WriteStartElement (name);
            writer.WriteValue (value);
            writer.WriteEndElement ();
        }
	}
}
